home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / AmiVoGL_MDEV.lha / src / viewp.c < prev    next >
C/C++ Source or Header  |  1997-08-17  |  4KB  |  193 lines

  1. #include <stdio.h>
  2. #include "vogl.h"
  3.  
  4. static    Vstack    *vsfree =  (Vstack *) NULL;
  5.  
  6.  
  7. /*
  8.  * pushviewport
  9.  *
  10.  * pushes the current viewport on the viewport stack
  11.  *
  12.  */
  13. void pushviewport(void)
  14. {
  15. Vstack    *nvport;
  16. Token    *tok;
  17.  
  18. if (!vdevice.initialised)
  19. verror("pushviewport: vogl not initialised");
  20.  
  21. if (vdevice.inobject) {
  22.     tok = newtokens(1);
  23.  
  24.     tok->i = PUSHVIEWPORT;
  25.  
  26.     return;
  27.     }
  28.  
  29. if (vsfree != (Vstack *)NULL) {
  30.     nvport = vdevice.viewport;
  31.     vdevice.viewport = vsfree;
  32.     vsfree = vsfree->back;
  33.     vdevice.viewport->back = nvport;
  34.     vdevice.viewport->v.left = nvport->v.left;
  35.     vdevice.viewport->v.right = nvport->v.right;
  36.     vdevice.viewport->v.bottom = nvport->v.bottom;
  37.     vdevice.viewport->v.top = nvport->v.top;
  38.     }
  39. else {
  40.     nvport = (Vstack *)vallocate(sizeof(Vstack));
  41.     nvport->back = vdevice.viewport;
  42.     nvport->v.left = vdevice.viewport->v.left;
  43.     nvport->v.right = vdevice.viewport->v.right;
  44.     nvport->v.bottom = vdevice.viewport->v.bottom;
  45.     nvport->v.top = vdevice.viewport->v.top;
  46.     vdevice.viewport = nvport;
  47.     }
  48. }
  49.  
  50. /* ------------------------------------------------------------------------ */
  51.  
  52. /*
  53.  * popviewport
  54.  *
  55.  * pops the top viewport off the viewport stack.
  56.  *
  57.  */
  58. void popviewport(void)
  59. {
  60. Token    *tok;
  61. Vstack    *nvport;
  62.  
  63. if (!vdevice.initialised)
  64. verror("popviewport: vogl not initialised");
  65.  
  66. if (vdevice.inobject) {
  67.     tok = newtokens(1);
  68.  
  69.     tok->i = POPVIEWPORT;
  70.  
  71.     return;
  72.     }
  73.  
  74. if (vdevice.viewport->back == (Vstack *)NULL)
  75. verror("popviewport: viewport stack underflow");
  76. else {
  77.     nvport = vdevice.viewport;
  78.     vdevice.viewport = vdevice.viewport->back;
  79.     nvport->back = vsfree;
  80.     vsfree = nvport;
  81.     }
  82.  
  83. vdevice.maxVx = (int)(vdevice.viewport->v.right * vdevice.sizeSx);
  84. vdevice.maxVy = (int)(vdevice.viewport->v.top * vdevice.sizeSy);
  85. vdevice.minVx = (int)(vdevice.viewport->v.left * vdevice.sizeSx);
  86. vdevice.minVy = (int)(vdevice.viewport->v.bottom * vdevice.sizeSy);
  87.  
  88. CalcW2Vcoeffs();
  89. }
  90.  
  91. /* ------------------------------------------------------------------------ */
  92.  
  93. /*
  94.  * viewport
  95.  *
  96.  * Define a Viewport in Normalized Device Coordinates
  97.  *
  98.  * The viewport defines that fraction of the screen that the window will
  99.  * be mapped onto. Unlike in VOGLE  the screen dimension is from 0 to sizeX
  100.  * and 0 to sizeY.
  101.  */
  102. void viewport(
  103.   Screencoord xlow,
  104.   Screencoord xhigh,
  105.   Screencoord ylow,
  106.   Screencoord yhigh)
  107. {
  108. Token    *tok;
  109. char    buf[35];
  110.  
  111. if (!vdevice.initialised) 
  112. verror("viewport: vogl not initialised");
  113.  
  114. /*
  115.  *    A few preliminary checks ....
  116.  */
  117.  
  118. if (xlow < 0 || xhigh < 0) {
  119.     sprintf(buf,"viewport: x dimension value is invalid");
  120.     verror(buf);
  121.     } 
  122.  
  123. if (ylow < 0 || yhigh < 0) {
  124.     sprintf(buf,"viewport: y dimension value is invalid");
  125.     verror(buf);
  126.     } 
  127.  
  128. if (xlow >= xhigh) {
  129.     sprintf(buf,"viewport: xleft(%d) >= xright(%d)", xlow, xhigh);
  130.     verror(buf);
  131.     } 
  132. if (ylow >= yhigh) {
  133.     sprintf(buf,"viewport: ybottom(%d) >= ytop(%d)", ylow, yhigh);
  134.     verror(buf);
  135.     } 
  136.  
  137. if (vdevice.inobject) {
  138.     tok = newtokens(5);
  139.  
  140.     tok[0].i = VIEWPORT;
  141.     tok[1].i = xlow;
  142.     tok[2].i = xhigh;
  143.     tok[3].i = ylow;
  144.     tok[4].i = yhigh;
  145.  
  146.     return;
  147.     }
  148.  
  149. if (xhigh >= vdevice.sizeSx)
  150. xhigh = vdevice.sizeSx;
  151.  
  152. if (yhigh >= vdevice.sizeSy)
  153. yhigh = vdevice.sizeSy;
  154.  
  155. /*
  156.  * Make sure the viewport stack knows about us.....
  157.  */
  158. vdevice.viewport->v.left = xlow / (float)vdevice.sizeSx;
  159. vdevice.viewport->v.right = xhigh / (float)vdevice.sizeSx;
  160. vdevice.viewport->v.bottom = ylow / (float)vdevice.sizeSy;
  161. vdevice.viewport->v.top = yhigh / (float)vdevice.sizeSy;
  162.  
  163. vdevice.minVx = xlow;
  164. vdevice.minVy = ylow;
  165. vdevice.maxVx = xhigh;
  166. vdevice.maxVy = yhigh;
  167.  
  168. CalcW2Vcoeffs();
  169. }
  170.  
  171. /* ------------------------------------------------------------------------ */
  172.  
  173. /*
  174.  * getviewport
  175.  *
  176.  *    Returns the left, right, bottom and top limits of the current
  177.  *    viewport.
  178.  */
  179. void getviewport(
  180.   Screencoord *left,
  181.   Screencoord *right,
  182.   Screencoord *bottom,
  183.   Screencoord *top)
  184. {
  185. *right = vdevice.maxVx;
  186. *top = vdevice.maxVy;
  187. *left = vdevice.minVx;
  188. *bottom = vdevice.minVy;
  189. }
  190.  
  191. /* ------------------------------------------------------------------------ */
  192.  
  193.